iT邦幫忙

2021 iThome 鐵人賽

DAY 19
3
Modern Web

All In One NFT Website Development系列 第 19

Day 19【ERC-721】用兵之道在一個奇字,2999兵分2999路

  • 分享至 

  • xImage
  •  

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/73e388da-dfa1-4f26-a232-6f20ab1128ed/aCHSyLdl.jpg

【前言】
之前在 Day 3 有介紹過 Non-fungible Token(非同質化代幣)與相關的代幣標準,其實 ERC-721 Token 的敘述就是 NFT。今天的文章會著重在程式碼與開發的部分,內容可能有點複雜但我會盡力以我的小腦袋理解並敘述給各位的!

【NFTs & ERC-721】
ERC-721 正式應用為 2018-01-24 由 William Entriken, Dieter Shirley, Jacob Evans, Nastassia Sachs 發行,Dieter Shirley 也是 Axiom Zen 的技術總監,就是第一個使用 ERC-721 作為去中心化遊戲應用 CryptoKitties 的公司。用於處理不可替換資產的另一種以太坊代幣標準。我們有在 Day 16 短暫介紹過什麼是智能合約,這邊就不再重複敘述,直接介紹重點!

所有的 NFTs 都會擁有一個 uint256 也就是 256 位元的代號,也就是 tokenId 所以在每個 ERC-721 的合約之中, 每組 contract address, uint256 tokenId 都是獨一無二的,這種代幣可以通過區塊鏈上的智能合約追蹤,從而形塑數位化的資產。在 dApp 都有一個 "converter" 可以以 tokenId 為輸入並輸出有趣又特別的圖片。也就是眾所皆知的 NFT 藝術收藏品!也就是說每一個代幣的代號都會被記錄,就像 2020 年的孔明已經不再是指揮一個軍隊,而是把每一個小兵的動向都運籌得淋漓盡致!

513duf.jpg

【ERC-20 的功能函數、事件與資訊】

ERC-20 在 2015-11-19 由 Fabian Vogelsteller, Vitalik Buterin 提出。ERC-20 為目前以太坊上最多人使用的標準,此標準除了提高 Token 的互換性,還能在 Dapp 上面進行同樣的運行。常見的應用有:

穩定幣:與法定貨幣錨定的代幣,發行者可能持有相對應的抵押資產,或儲蓄。
安全代幣:為股權型代幣的一種,可能是有價證券,例如股票、債券或實物資產。
功能型代幣:遊戲貨幣、Dapp 燃料、忠誠度積分。

ERC-20 包含六個功能函式、兩個事件以及三個 Token 資訊的函式。

/*【功能函式】--------------------------------------------*/
function totalSupply() public view returns (uint256):
// Token 的總供應量,也就是這個智能合約的總供應量。

function balanceOf(address _owner) public view returns (uint256 balance):
// 可查詢 _owner 地址中的餘額。
// 在以太坊中帳戶都是公開的,只要知道地址就能查詢所有帳戶的餘額。

function transfer(address _to, uint256 _value) public returns (bool success):
// 轉移代幣;發送數量為 _value 的 Token 到地址 _to,觸發 Transfer 事件。

function transferFrom(address _from, address _to, uint256 _value) public returns (bool success):
// 從地址 _from 發送數量為 _value 的通證到地址 _to,觸發 Transfer 事件。

function approve(address _spender, uint256 _value) public returns (bool success):
// 批准代幣轉移;批准 _spender 提取一定數量的金額。

function allowance(address _owner, address _spender) public view returns (uint256 remaining):
// 回傳批准給地址的代幣數量;回報 _spender 從 _owner 提取的金額。

/*【事件函式】--------------------------------------------*/
event Transfer(address indexed _from, address indexed _to, uint256 _value):
// 轉移代幣事件;當token被轉移時則會觸發。

event Approval(address indexed _owner, address indexed _spender, uint256 _value):
// 代幣批准觸發事件;成功調用approve方法後則會觸發。

/*【Token 資訊函式】--------------------------------------------*/
function name() public view returns (string):
// 代幣的全名;也就是發行Token之名稱

function symbol() public view returns (string):
// 發行Token之代稱,也能稱作代幣縮寫。

function decimals() public view returns (uint8):
// 代幣的最小單位數值;設定此Token最多能達到小位數點後多少位數。

EIP-20: ERC-20 Token Standard
ERC-20 Token Standard | ethereum.org

【ERC-721 的功能函數、事件與資訊】

ERC-721 除了本身兼容了 ERC-20 內的規則,還包含以下的函式:

/*【Token 資訊函式】--------------------------------------------*/
function name() external view returns (string _name);

function symbol() external view returns (string _symbol);

function tokenURI(uint256 _tokenId) external view returns (string);
// A distinct Uniform Resource Identifier (URI) for a given asset.

/*【功能函式】--------------------------------------------*/
function totalSupply() external view returns (uint256);
// return A count of valid NFTs tracked by this contract

function tokenByIndex(uint256 _index) external view returns (uint256);
// return The token identifier for the `_index`th NFT,

function tokenOfOwnerByIndex(address _owner, uint256 _index) external view returns (uint256);
// return The token identifier for the `_index`th NFT assigned to `_owner`,
// 每個所有者可以同時擁有一個以上的 NFT。其獨特的 ID 可以識別每一個 NFT,結果可能會變得難以跟蹤 ID。所以合約將這些 ID 存儲在一個數組中,tokenOfOwnerByIndex 函數讓我們從數組中檢索這些信息。

function balanceOf(address _owner) external view returns (uint256);
// return The number of NFTs owned by `_owner`, possibly zero

function ownerOf(uint256 _tokenId) external view returns (address); 代幣所有權發送
// Find the owner of an NFT

function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes data) external payable;

function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
// Transfers the ownership of an NFT from one address to another address

function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
// Transfer ownership of an NFT

function approve(address _approved, uint256 _tokenId) external payable;

function setApprovalForAll(address _operator, bool _approved) external;

function getApproved(uint256 _tokenId) external view returns (address);

function isApprovedForAll(address _owner, address _operator) external view returns (bool);

/*【事件函式】--------------------------------------------*/
event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

可以看到兼容 ERC-20 的函式有幾個,但在 ERC-721 中也出現新的函式。開發者讓智能合約能夠支持記錄及轉移代幣的所有權。此外在 ERC-721 中 approve 以及 transfer 都被重新設計。

ERC-721 Non-Fungible Token Standard | ethereum.org
EIP-721: ERC-721 Non-Fungible Token Standard

【小結】
今天篇幅好像夠了,其實加上理解程式碼之後能講的東西很多,所以關於以太坊代幣標準 ERC-721 的內容就分成兩篇吧。如果對 ERC-721 有興趣的人明天請記得也來關注一下啊!

h4c9ha5brag71.png

【參考資料】
ERC: Non-fungible Token Standard · Issue #721 · ethereum/EIPs
https://coincentral.com/future-of-erc-721-and-unique-assets/
EIPs/eip-721.md at master · ethereum/EIPs


上一篇
Day 18【Opensea.js】我的這把刀可是塗滿了毒藥的毒刃
下一篇
Day 20【ERC-721】They don't know I own this song's non-fungible token
系列文
All In One NFT Website Development32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言